home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1998 September / Macworld (1998-09).dmg / Shareware World / Info / For Developers / MacZoop 1.8.3 / Required Classes / Z Sources / ZCommander.cpp < prev    next >
Text File  |  1998-06-11  |  7KB  |  289 lines

  1. /*************************************************************************************************
  2. *
  3. *
  4. *            MacZoop - "the framework for the rest of us"         
  5. *
  6. *
  7. *
  8. *            ZCommander.cpp            -- an object for handling commands
  9. *
  10. *
  11. *
  12. *
  13. *
  14. *            © 1996, Graham Cox
  15. *
  16. *
  17. *
  18. *
  19. *************************************************************************************************/
  20.  
  21. #include    "ZCommander.h"
  22. #include    "ZObjectArray.cpp"
  23. #include    "MacZoop.h"
  24.  
  25.  
  26. CLASSCONSTRUCTOR( ZCommander );
  27.  
  28. /*----------------------------------***  CONSTRUCTOR  ***----------------------------------*/
  29.  
  30. ZCommander::ZCommander( ZCommander* aBoss )
  31.     : ZComrade()
  32. {
  33.     classID = CLASS_ZCommander;
  34.     
  35.     itsBoss = aBoss;
  36.     itsUnderlings = NULL;
  37.     
  38.     if ( itsBoss )
  39.         itsBoss->AddUnderling( this );
  40. }
  41.  
  42.  
  43. ZCommander::ZCommander()
  44.     : ZComrade()
  45. {
  46.     classID = CLASS_ZCommander;
  47.  
  48.     itsBoss = NULL;
  49.     itsUnderlings = NULL;
  50. }
  51.  
  52. /*-----------------------------------***  DESTRUCTOR  ***----------------------------------*/
  53.  
  54. ZCommander::~ZCommander()
  55. {
  56.     // dispose of any objects whose boss this is 
  57.     
  58.     if ( itsUnderlings )
  59.         itsUnderlings->DisposeAll();
  60.     
  61.     // remove us from our boss
  62.  
  63.     if ( itsBoss )
  64.         itsBoss->RemoveUnderling( this );
  65. }
  66.  
  67.  
  68. /*-------------------------------***  HANDLECOMMAND  ***---------------------------------*/
  69. /*    
  70.  
  71. if it has a boss, it passes the command to it for handling
  72. ----------------------------------------------------------------------------------------*/
  73.  
  74. void    ZCommander::HandleCommand( const short menuID, const short itemID )
  75. {
  76.     if ( itsBoss )
  77.         itsBoss->HandleCommand( menuID, itemID );
  78. }
  79.  
  80.  
  81. /*-------------------------------***  HANDLECOMMAND  ***--------------------------------*/
  82. /*    
  83. pass command object to boss if there is one
  84. ----------------------------------------------------------------------------------------*/
  85.  
  86. void    ZCommander::HandleCommand( const long theCommand )
  87. {
  88.     // pass edit menu commands to the local handler methods. It is easier to override
  89.     // those methods than to override this method, but the choice is yours.
  90.     
  91.     switch ( theCommand )
  92.     {
  93.         case kCmdCut:
  94.             DoCut();
  95.             break;
  96.         
  97.         case kCmdCopy:
  98.             DoCopy();
  99.             break;
  100.         
  101.         case kCmdPaste:
  102.             DoPaste();
  103.             break;
  104.         
  105.         case kCmdClear:
  106.             DoClear();
  107.             break;
  108.         
  109.         case kCmdSelectAll:
  110.             DoSelectAll();
  111.             break;
  112.         
  113.         default:
  114.             if ( itsBoss )
  115.                 itsBoss->HandleCommand( theCommand );
  116.             break;
  117.     }
  118. }
  119.  
  120.  
  121. /*-------------------------------***  UPDATEMENUS  ***---------------------------------*/
  122. /*    
  123.  
  124. if it has a boss, it asks it to update its menus
  125.  
  126. ----------------------------------------------------------------------------------------*/
  127.  
  128. void    ZCommander::UpdateMenus()
  129. {
  130.     // enable the paste command if there is something this object can
  131.     // paste.
  132.     
  133.     if ( CanPasteType())
  134.         gMenuBar->EnableCommand( kCmdPaste );
  135.     
  136.     if ( itsBoss )
  137.         itsBoss->UpdateMenus();
  138. }
  139.  
  140.  
  141.  
  142. /*-----------------------------***  HANDLEAPPLEEVENT  ***-------------------------------*/
  143. /*    
  144.  
  145. if it has a boss, it passes the command to it for handling. Override this to process
  146. apple events you are interested in, call the inherited method for others.
  147. ----------------------------------------------------------------------------------------*/
  148.  
  149. void    ZCommander::HandleAppleEvent(    AEEventClass aeClass, AEEventID aeID,
  150.                                         AppleEvent* aeEvt, AppleEvent* reply )
  151. {    
  152.     if ( itsBoss )
  153.         itsBoss->HandleAppleEvent( aeClass, aeID, aeEvt, reply );
  154. }
  155.  
  156.  
  157. /*-----------------------------------***  IDLE  ***-------------------------------------*/
  158. /*    
  159.  
  160. called periodically if this is in the chain of command. It passes the call up to its boss.
  161.  
  162. ----------------------------------------------------------------------------------------*/
  163.  
  164. void    ZCommander::Idle()
  165. {
  166.     if ( itsBoss )
  167.         itsBoss->Idle();
  168. }
  169.  
  170.  
  171. /*-----------------------------------***  TYPE  ***-------------------------------------*/
  172. /*    
  173.  
  174. this user is typing while this commander is active
  175.  
  176. ----------------------------------------------------------------------------------------*/
  177.  
  178. void    ZCommander::Type( const char theKey, const short modifiers )
  179. {
  180.     if ( theKey == BACKSPACE_KEY )
  181.         DoClear();
  182.     else
  183.     {
  184.         if ( itsBoss )
  185.             itsBoss->Type( theKey, modifiers );
  186.     }
  187. }
  188.  
  189.  
  190. /*-------------------------------***  ADDUNDERLING  ***---------------------------------*/
  191. /*    
  192. adds <anUnderling> to its list of underlings
  193. ----------------------------------------------------------------------------------------*/
  194.  
  195. void    ZCommander::AddUnderling( ZCommander* anUnderling )
  196. {
  197.     if ( itsUnderlings == NULL )
  198.         FailNIL( itsUnderlings = new ZCommanderList());
  199.     
  200.     itsUnderlings->AppendItem( anUnderling );
  201. }
  202.  
  203. /*-----------------------------***  REMOVEUNDERLING  ***--------------------------------*/
  204. /*    
  205. removes <anUnderling> from its list of underlings
  206. ----------------------------------------------------------------------------------------*/
  207.  
  208. void    ZCommander::RemoveUnderling( ZCommander* anUnderling )
  209. {
  210.     if ( itsUnderlings && itsUnderlings->Contains( anUnderling ))
  211.     {
  212.         itsUnderlings->DeleteObject( anUnderling );
  213.         
  214.         if ( itsUnderlings->CountItems() < 1 )
  215.             ForgetObject( itsUnderlings );
  216.     }    
  217. }
  218.  
  219. /*--------------------------------***  SENDMESSAGE  ***---------------------------------*/
  220. /*    
  221. send the message to the boss as well as any nominated listeners
  222. ----------------------------------------------------------------------------------------*/
  223.  
  224. void    ZCommander::SendMessage( long aMessage, void* msgData )
  225. {
  226.     // we always send this message to our boss
  227.     
  228.     if ( itsBoss )
  229.         itsBoss->ReceiveMessage( this, aMessage, msgData );
  230.         
  231.     ZComrade::SendMessage( aMessage, msgData );
  232. }
  233.  
  234.  
  235. /*--------------------------------***  SENDMESSAGE  ***---------------------------------*/
  236. /*    
  237. send the message to the boss as well as any nominated listeners
  238. ----------------------------------------------------------------------------------------*/
  239.  
  240. void    ZCommander::SendMessage( ZMessage* aMessage )
  241. {
  242.     // we always send this message to our boss
  243.  
  244.     if ( itsBoss )
  245.         itsBoss->ReceiveMessage( this, aMessage );
  246.         
  247.     ZComrade::SendMessage( aMessage );
  248. }
  249.  
  250.  
  251. /*-------------------------------***  WRITETOSTREAM  ***--------------------------------*/
  252. /*    
  253. make a note of who our boss and underlings are
  254. ----------------------------------------------------------------------------------------*/
  255.  
  256. void    ZCommander::WriteToStream( ZStream* aStream )
  257. {
  258. #if _MACZOOP_STREAMS
  259.     ZComrade::WriteToStream( aStream );
  260.     
  261.     // write boss of this commander- it's OK if it's NULL.
  262.     
  263.     aStream->WriteObject( itsBoss );
  264.  
  265.     // we do not explicitly write the underlings to the stream, since that is set
  266.     // up anyway when a command chain is relinked from a stream.
  267. #endif
  268. }
  269.  
  270. /*-------------------------------***  READFROMSTREAM  ***-------------------------------*/
  271. /*    
  272. read in our boss and underlings from the stream
  273. ----------------------------------------------------------------------------------------*/
  274.  
  275. void    ZCommander::ReadFromStream( ZStream* aStream )
  276. {
  277. #if _MACZOOP_STREAMS
  278.     ZComrade::ReadFromStream( aStream );
  279.     
  280.     itsBoss = (ZCommander*) aStream->ReadObject();
  281.     
  282.     // add this commander to its bosses underlings list:
  283.     
  284.     if ( itsBoss )
  285.         itsBoss->AddUnderling( this );
  286. #endif
  287. }
  288.  
  289.